package com.levi.juc.pool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 手动创建线程池
 * 可以容纳的最大线程数量  =  最大线程数  +  阻塞队列的长度
 * 当线程超出容纳的最大线程数量时候，就会触发拒绝策略
 *
 * ****   四种拒绝策略   *****
 * 1.AbortPolicy()   直接抛出异常
 * 2.CallerRunsPolicy()   哪里来的回哪里去
 * 3.DiscardPolicy()  不抛出异常，直接丢弃
 * 4.DiscardOldestPolicy()  尝试等待最早的线程，看是否执行完，如果没有执行完就直接求掉这个请求线程
 *
 * 最大线程数如何定义?
 * Cpu密集型   电脑最多可以创建多少个线程就设置多少
 * IO密集型    判断程序中有多少个消耗大量IO的线程，最大线程数设置为两倍
 *
 */
public class ThreadPoolExecutorTest {
    public static void main(String[] args) {
        //获取电脑最大线程数
        int availableProcessors = Runtime.getRuntime().availableProcessors();
        System.out.println("电脑可执行的最大线程数: "+availableProcessors);
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(
                2,//核心线程数量
                availableProcessors,//最大线程数量
                3,//多久没有用到这个线程，就会把线程释放
                TimeUnit.SECONDS,//时间单位
                new LinkedBlockingDeque<>(3),//阻塞队列，相当于等待区,等待区满了之后才会使用最大线程数
                Executors.defaultThreadFactory(),//默认线程工厂
                new ThreadPoolExecutor.DiscardPolicy())//拒绝策略
                ;
        try {
            for (int i = 1; i <= 50; i++) {
                poolExecutor.execute(()->{
                    System.out.println("线程id: "+Thread.currentThread().getName());
//                    try {
//                        Thread.sleep(3000);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            poolExecutor.shutdown();
        }


    }
}
